#include "viml/value.h"
#include <gtest/gtest.h>

namespace viml {

class ValueTest : public ::testing::Test {
protected:
    // 可以在这里添加测试所需的设置代码
};

TEST_F(ValueTest, NumberValue) {
    // 测试数字值
    Value value(42.0);
    
    // 验证值类型和内容
    EXPECT_TRUE(value.is_number());
    EXPECT_FALSE(value.is_string());
    EXPECT_FALSE(value.is_boolean());
    EXPECT_FALSE(value.is_nil());
    EXPECT_EQ(value.as_number(), 42.0);
}

TEST_F(ValueTest, StringValue) {
    // 测试字符串值
    Value value("test_string");
    
    // 验证值类型和内容
    EXPECT_FALSE(value.is_number());
    EXPECT_TRUE(value.is_string());
    EXPECT_FALSE(value.is_boolean());
    EXPECT_FALSE(value.is_nil());
    EXPECT_EQ(value.as_string(), "test_string");
}

TEST_F(ValueTest, BooleanValue) {
    // 测试布尔值
    Value value(true);
    
    // 验证值类型和内容
    EXPECT_FALSE(value.is_number());
    EXPECT_FALSE(value.is_string());
    EXPECT_TRUE(value.is_boolean());
    EXPECT_FALSE(value.is_nil());
    EXPECT_TRUE(value.as_boolean());
}

TEST_F(ValueTest, NilValue) {
    // 测试nil值
    Value value;
    
    // 验证值类型和内容
    EXPECT_FALSE(value.is_number());
    EXPECT_FALSE(value.is_string());
    EXPECT_FALSE(value.is_boolean());
    EXPECT_TRUE(value.is_nil());
}

TEST_F(ValueTest, ListValue) {
    // 测试列表值
    auto list = std::make_shared<List>();
    list->elements.push_back(std::make_shared<Value>(42.0));
    Value value(list);
    
    // 验证值类型和内容
    EXPECT_FALSE(value.is_number());
    EXPECT_FALSE(value.is_string());
    EXPECT_FALSE(value.is_boolean());
    EXPECT_FALSE(value.is_nil());
    EXPECT_TRUE(value.is_list());
    
    auto retrieved_list = value.as_list();
    ASSERT_NE(retrieved_list, nullptr);
    ASSERT_EQ(retrieved_list->elements.size(), 1);
    EXPECT_TRUE(retrieved_list->elements[0]->is_number());
    EXPECT_EQ(retrieved_list->elements[0]->as_number(), 42.0);
}

TEST_F(ValueTest, DictValue) {
    // 测试字典值
    auto dict = std::make_shared<Dict>();
    dict->elements["key"] = std::make_shared<Value>("value");
    Value value(dict);
    
    // 验证值类型和内容
    EXPECT_FALSE(value.is_number());
    EXPECT_FALSE(value.is_string());
    EXPECT_FALSE(value.is_boolean());
    EXPECT_FALSE(value.is_nil());
    EXPECT_TRUE(value.is_dict());
    
    auto retrieved_dict = value.as_dict();
    ASSERT_NE(retrieved_dict, nullptr);
    ASSERT_EQ(retrieved_dict->elements.size(), 1);
    EXPECT_TRUE(retrieved_dict->elements.count("key"));
    EXPECT_EQ(retrieved_dict->elements["key"]->as_string(), "value");
}

TEST_F(ValueTest, ValueEquality) {
    // 测试值相等性
    Value num1(42.0);
    Value num2(42.0);
    Value num3(43.0);
    
    EXPECT_TRUE(num1 == num2);
    EXPECT_FALSE(num1 == num3);
    
    Value str1("test");
    Value str2("test");
    Value str3("different");
    
    EXPECT_TRUE(str1 == str2);
    EXPECT_FALSE(str1 == str3);
    
    Value bool1(true);
    Value bool2(true);
    Value bool3(false);
    
    EXPECT_TRUE(bool1 == bool2);
    EXPECT_FALSE(bool1 == bool3);
}

TEST_F(ValueTest, ValueToString) {
    // 测试值到字符串的转换
    Value num(42.0);
    EXPECT_EQ(num.to_string(), "42");
    
    Value str("test");
    EXPECT_EQ(str.to_string(), "test");
    
    Value boolean(true);
    EXPECT_EQ(boolean.to_string(), "true");
    
    Value nil;
    EXPECT_EQ(nil.to_string(), "nil");
    
    // 注意：对于复杂类型（列表、字典），to_string()可能返回特定格式或标识符
    // 这里只测试基本类型
}

} // namespace viml